```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Spring AOP 切面编程深度解析</title>
    <link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css">
    <link rel="stylesheet" href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            color: #333;
            line-height: 1.6;
        }
        .heading {
            font-family: 'Noto Serif SC', serif;
        }
        .drop-cap::first-letter {
            float: left;
            font-family: 'Noto Serif SC', serif;
            font-size: 4.5rem;
            line-height: 0.65;
            margin: 0.1em 0.2em 0 0;
            color: #4f46e5;
        }
        .card-hover:hover {
            transform: translateY(-5px);
            box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
        }
        .gradient-bg {
            background: linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%);
        }
        .code-block {
            background: #2d2d2d;
            border-left: 4px solid #4f46e5;
        }
        .timeline-item::before {
            content: '';
            position: absolute;
            left: 0;
            top: 0;
            width: 4px;
            height: 100%;
            background: #4f46e5;
            border-radius: 2px;
        }
        .footer-link:hover {
            color: #a5b4fc;
        }
    </style>
</head>
<body class="bg-gray-50">
    <!-- Hero Section -->
    <section class="gradient-bg text-white py-20 px-4 md:px-0">
        <div class="container mx-auto max-w-5xl text-center">
            <h1 class="heading text-4xl md:text-6xl font-bold mb-6">Spring AOP 切面编程</h1>
            <p class="text-xl md:text-2xl max-w-3xl mx-auto mb-8">解耦横切关注点，实现优雅的模块化设计</p>
            <div class="flex justify-center space-x-4">
                <a href="#intro" class="px-6 py-3 bg-white text-indigo-600 font-medium rounded-lg hover:bg-gray-100 transition duration-300">
                    <i class="fas fa-book-open mr-2"></i>开始阅读
                </a>
                <a href="#examples" class="px-6 py-3 bg-indigo-800 text-white font-medium rounded-lg hover:bg-indigo-900 transition duration-300">
                    <i class="fas fa-code mr-2"></i>查看示例
                </a>
            </div>
        </div>
    </section>

    <!-- Main Content -->
    <div class="container mx-auto max-w-5xl py-12 px-4 md:px-0">
        <!-- Introduction Section -->
        <section id="intro" class="mb-16">
            <div class="bg-white rounded-xl shadow-lg p-8 mb-8">
                <h2 class="heading text-3xl font-bold mb-6 text-gray-800">切面编程的核心概念</h2>
                <p class="drop-cap text-gray-700 mb-6">在Spring框架中，切面（Aspect）是面向切面编程（Aspect-Oriented Programming，AOP）的核心概念之一。切面用于定义跨越多个类的关注点或逻辑，常用于处理日志记录、事务管理、安全控制等功能。Spring AOP允许开发者将这些关注点与业务逻辑分离，从而提高代码的模块化和可维护性。</p>
                
                <div class="grid md:grid-cols-2 gap-8 mt-8">
                    <div class="bg-indigo-50 p-6 rounded-lg border border-indigo-100">
                        <div class="flex items-center mb-4">
                            <div class="bg-indigo-100 p-3 rounded-full mr-4">
                                <i class="fas fa-puzzle-piece text-indigo-600"></i>
                            </div>
                            <h3 class="heading text-xl font-semibold text-gray-800">模块化设计</h3>
                        </div>
                        <p class="text-gray-700">将横切关注点集中管理，避免代码分散在各个业务模块中，提高代码的可维护性和复用性。</p>
                    </div>
                    <div class="bg-amber-50 p-6 rounded-lg border border-amber-100">
                        <div class="flex items-center mb-4">
                            <div class="bg-amber-100 p-3 rounded-full mr-4">
                                <i class="fas fa-project-diagram text-amber-600"></i>
                            </div>
                            <h3 class="heading text-xl font-semibold text-gray-800">解耦业务逻辑</h3>
                        </div>
                        <p class="text-gray-700">将辅助功能（如日志、事务）与核心业务逻辑分离，使代码更加清晰，职责更加单一。</p>
                    </div>
                </div>
            </div>
        </section>

        <!-- Definition Section -->
        <section class="mb-16">
            <div class="bg-white rounded-xl shadow-lg p-8 mb-8">
                <h2 class="heading text-3xl font-bold mb-6 text-gray-800">1. 切面的定义</h2>
                <p class="text-gray-700 mb-6"><span class="font-bold text-indigo-600">切面（Aspect）</span> 是一种模块化的关注点，它将横切关注点（cross-cutting concerns）集中在一个模块中。横切关注点指的是在多个模块中都需要处理的功能，例如事务管理、日志记录等。切面通过定义通知（Advice）和切入点（Pointcut）来实现对这些横切关注点的处理。</p>
                
                <div class="bg-blue-50 border-l-4 border-blue-500 p-4 mb-6">
                    <div class="flex">
                        <div class="flex-shrink-0 text-blue-500">
                            <i class="fas fa-info-circle"></i>
                        </div>
                        <div class="ml-3">
                            <p class="text-sm text-blue-700">
                                横切关注点是指那些影响应用程序多个部分的关注点，它们通常不能很好地被分解到应用程序的层次结构中。
                            </p>
                        </div>
                    </div>
                </div>
            </div>
        </section>

        <!-- Components Section -->
        <section class="mb-16">
            <div class="bg-white rounded-xl shadow-lg p-8">
                <h2 class="heading text-3xl font-bold mb-6 text-gray-800">2. 切面的组成部分</h2>
                <p class="text-gray-700 mb-8">切面通常由以下几个核心组件组成，它们共同协作实现对横切关注点的处理。</p>
                
                <!-- Components Grid -->
                <div class="grid md:grid-cols-2 gap-6 mb-8">
                    <!-- Advice Card -->
                    <div class="card-hover bg-white border border-gray-200 rounded-lg shadow-sm p-6 transition duration-300">
                        <div class="flex items-center mb-4">
                            <div class="bg-indigo-100 p-2 rounded-lg mr-4">
                                <i class="fas fa-bell text-indigo-600 text-xl"></i>
                            </div>
                            <h3 class="heading text-xl font-semibold text-gray-800">2.1 通知（Advice）</h3>
                        </div>
                        <p class="text-gray-700 mb-4">通知定义了在切入点匹配的连接点处执行的具体逻辑。Spring AOP中常见的通知类型包括：</p>
                        <ul class="space-y-2 text-gray-700">
                            <li class="flex items-start">
                                <i class="fas fa-arrow-right text-indigo-500 mt-1 mr-2 text-sm"></i>
                                <span><span class="font-medium">前置通知（Before Advice）</span>：在目标方法执行之前执行的通知。</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-arrow-right text-indigo-500 mt-1 mr-2 text-sm"></i>
                                <span><span class="font-medium">后置通知（After Advice）</span>：在目标方法执行之后执行的通知。</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-arrow-right text-indigo-500 mt-1 mr-2 text-sm"></i>
                                <span><span class="font-medium">环绕通知（Around Advice）</span>：在目标方法执行之前和之后执行的通知。</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-arrow-right text-indigo-500 mt-1 mr-2 text-sm"></i>
                                <span><span class="font-medium">引导通知（Introduction Advice）</span>：可以为目标对象引入新的方法或属性。</span>
                            </li>
                        </ul>
                    </div>
                    
                    <!-- Pointcut Card -->
                    <div class="card-hover bg-white border border-gray-200 rounded-lg shadow-sm p-6 transition duration-300">
                        <div class="flex items-center mb-4">
                            <div class="bg-indigo-100 p-2 rounded-lg mr-4">
                                <i class="fas fa-crosshairs text-indigo-600 text-xl"></i>
                            </div>
                            <h3 class="heading text-xl font-semibold text-gray-800">2.2 切入点（Pointcut）</h3>
                        </div>
                        <p class="text-gray-700 mb-4">切入点定义了通知的适用范围，指定在哪些连接点上应用通知。切入点通常使用表达式来定义，例如：</p>
                        <ul class="space-y-2 text-gray-700">
                            <li class="flex items-start">
                                <i class="fas fa-code text-indigo-500 mt-1 mr-2 text-sm"></i>
                                <span>方法签名匹配</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-code text-indigo-500 mt-1 mr-2 text-sm"></i>
                                <span>注解匹配</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-code text-indigo-500 mt-1 mr-2 text-sm"></i>
                                <span>包路径匹配</span>
                            </li>
                        </ul>
                    </div>
                    
                    <!-- Joinpoint Card -->
                    <div class="card-hover bg-white border border-gray-200 rounded-lg shadow-sm p-6 transition duration-300">
                        <div class="flex items-center mb-4">
                            <div class="bg-indigo-100 p-2 rounded-lg mr-4">
                                <i class="fas fa-link text-indigo-600 text-xl"></i>
                            </div>
                            <h3 class="heading text-xl font-semibold text-gray-800">2.3 连接点（Joinpoint）</h3>
                        </div>
                        <p class="text-gray-700 mb-4">连接点是程序执行的一个特定点，例如：</p>
                        <ul class="space-y-2 text-gray-700">
                            <li class="flex items-start">
                                <i class="fas fa-caret-right text-indigo-500 mt-1 mr-2 text-sm"></i>
                                <span>方法调用</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-caret-right text-indigo-500 mt-1 mr-2 text-sm"></i>
                                <span>字段访问</span>
                            </li>
                            <li class="flex items-start">
                                <i class="fas fa-caret-right text-indigo-500 mt-1 mr-2 text-sm"></i>
                                <span>异常处理</span>
                            </li>
                        </ul>
                    </div>
                    
                    <!-- Target Object Card -->
                    <div class="card-hover bg-white border border-gray-200 rounded-lg shadow-sm p-6 transition duration-300">
                        <div class="flex items-center mb-4">
                            <div class="bg-indigo-100 p-2 rounded-lg mr-4">
                                <i class="fas fa-bullseye text-indigo-600 text-xl"></i>
                            </div>
                            <h3 class="heading text-xl font-semibold text-gray-800">2.4 目标对象（Target Object）</h3>
                        </div>
                        <p class="text-gray-700">目标对象是被切面拦截的实际对象，切面中的通知将作用于目标对象的连接点。在Spring AOP中，目标对象通常是Spring管理的bean实例。</p>
                    </div>
                </div>
                
                <!-- Visualization -->
                <div class="mt-10 mb-8">
                    <h3 class="heading text-xl font-semibold text-gray-800 mb-4">切面组件关系图</h3>
                    <div class="mermaid">
                        graph TD
                            A[切面 Aspect] --> B[通知 Advice]
                            A --> C[切入点 Pointcut]
                            C --> D[连接点 Joinpoint]
                            D --> E[目标对象 Target Object]
                            B -->|作用在| D
                            style A fill:#eef2ff,stroke:#4f46e5
                            style B fill:#eef2ff,stroke:#4f46e5
                            style C fill:#eef2ff,stroke:#4f46e5
                            style D fill:#eef2ff,stroke:#4f46e5
                            style E fill:#eef2ff,stroke:#4f46e5
                    </div>
                </div>
            </div>
        </section>

        <!-- Implementation Section -->
        <section id="examples" class="mb-16">
            <div class="bg-white rounded-xl shadow-lg p-8">
                <h2 class="heading text-3xl font-bold mb-6 text-gray-800">3. 切面的实现</h2>
                <p class="text-gray-700 mb-6">在Spring中，切面可以通过使用@Aspect注解和@Advice注解来定义。以下是实现切面的典型步骤：</p>
                
                <div class="space-y-8">
                    <!-- Step 1 -->
                    <div class="flex flex-col md:flex-row gap-6">
                        <div class="md:w-1/3">
                            <div class="bg-indigo-100 text-indigo-800 p-4 rounded-lg h-full">
                                <h3 class="heading text-xl font-semibold mb-2">3.1 定义切面类</h3>
                                <p>使用@Aspect注解定义切面类，并在其中编写通知方法。</p>
                            </div>
                        </div>
                        <div class="md:w-2/3">
                            <div class="code-block rounded-lg overflow-hidden">
                                <pre class="text-gray-300 p-4 text-sm"><code>import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    @Before("execution(* com.example.service.*.*(..))")
    public void logBeforeMethod(JoinPoint joinPoint) {
        System.out.println("Before method: " + joinPoint.getSignature().getName());
    }
}</code></pre>
                            </div>
                        </div>
                    </div>
                    
                    <!-- Step 2 -->
                    <div class="flex flex-col md:flex-row gap-6">
                        <div class="md:w-1/3">
                            <div class="bg-indigo-100 text-indigo-800 p-4 rounded-lg h-full">
                                <h3 class="heading text-xl font-semibold mb-2">3.2 配置Spring AOP</h3>
                                <p>在配置类中启用Spring AOP支持。</p>
                            </div>
                        </div>
                        <div class="md:w-2/3">
                            <div class="code-block rounded-lg overflow-hidden">
                                <pre class="text-gray-300 p-4 text-sm"><code>import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
    // 配置切面和其他bean
}</code></pre>
                            </div>
                        </div>
                    </div>
                </div>
                
                <div class="mt-8">
                    <h3 class="heading text-xl font-semibold text-gray-800 mb-4">通知类型对比</h3>
                    <div class="overflow-x-auto">
                        <table class="min-w-full divide-y divide-gray-200">
                            <thead class="bg-gray-50">
                                <tr>
                                    <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">通知类型</th>
                                    <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">执行时机</th>
                                    <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">典型应用</th>
                                    <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">是否可阻止方法执行</th>
                                </tr>
                            </thead>
                            <tbody class="bg-white divide-y divide-gray-200">
                                <tr>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">@Before</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">方法执行前</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">参数校验、日志记录</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">否</td>
                                </tr>
                                <tr>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">@AfterReturning</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">方法成功返回后</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">结果记录、缓存更新</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">否</td>
                                </tr>
                                <tr>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">@AfterThrowing</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">方法抛出异常后</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">异常处理、错误日志</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">否</td>
                                </tr>
                                <tr>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">@After</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">方法执行后（无论成功或异常）</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">资源清理</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">否</td>
                                </tr>
                                <tr>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">@Around</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">方法执行前后</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">事务管理、性能监控</td>
                                    <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">是</td>
                                </tr>
                            </tbody>
                        </table>
                    </div>
                </div>
            </div>
        </section>

        <!-- Applications Section -->
        <section class="mb-16">
            <div class="bg-white rounded-xl shadow-lg p-8">
                <h2 class="heading text-3xl font-bold mb-6 text-gray-800">4. 切面的应用场景</h2>
                <p class="text-gray-700 mb-8">切面在实际开发中有广泛的应用，以下是几个典型的使用场景：</p>
                
                <div class="grid md:grid-cols-3 gap-6">
                    <!-- Logging -->
                    <div class="card-hover bg-white border border-gray-200 rounded-lg shadow-sm p-6 transition duration-300">
                        <div class="flex items-center mb-4">
                            <div class="bg-indigo-100 p-3 rounded-lg mr-4">
                                <i class="fas fa-scroll text-indigo-600"></i>
                            </div>
                            <h3 class="heading text-xl font-semibold text-gray-800">日志记录</h3>
                        </div>
                        <p class="text-gray-700">自动记录方法调用的日志，包括参数、返回值、执行时间等信息，便于调试和审计。</p>
                    </div>
                    
                    <!-- Transaction -->
                    <div class="card-hover bg-white border border-gray-200 rounded-lg shadow-sm p-6 transition duration-300">
                        <div class="flex items-center mb-4">
                            <div class="bg-indigo-100 p-3 rounded-lg mr-4">
                                <i class="fas fa-exchange-alt text-indigo-600"></i>
                            </div>
                            <h3 class="heading text-xl font-semibold text-gray-800">事务管理</h3>
                        </div>
                        <p class="text-gray-700">管理数据库事务，确保操作的一致性。可以通过切面自动开启、提交或回滚事务。</p>
                    </div>
                    
                    <!-- Performance -->
                    <div class="card-hover bg-white border border-gray-200 rounded-lg shadow-sm p-6 transition duration-300">
                        <div class="flex items-center mb-4">
                            <div class="bg-indigo-100 p-3 rounded-lg mr-4">
                                <i class="fas fa-tachometer-alt text-indigo-600"></i>
                            </div>
                            <h3 class="heading text-xl font-semibold text-gray-800">性能监控</h3>
                        </div>
                        <p class="text-gray-700">监控方法的执行时间，进行性能分析，识别系统中的性能瓶颈。</p>
                    </div>
                    
                    <!-- Security -->
                    <div class="card-hover bg-white border border-gray-200 rounded-lg shadow-sm p-6 transition duration-300">
                        <div class="flex items-center mb-4">
                            <div class="bg-indigo-100 p-3 rounded-lg mr-4">
                                <i class="fas fa-shield-alt text-indigo-600"></i>
                            </div>
                            <h3 class="heading text-xl font-semibold text-gray-800">安全控制</h3>
                        </div>
                        <p class="text-gray-700">检查方法调用的权限，确保安全性。可通过切面实现基于角色的访问控制。</p>
                    </div>
                    
                    <!-- Caching -->
                    <div class="card-hover bg-white border border-gray-200 rounded-lg shadow-sm p-6 transition duration-300">
                        <div class="flex items-center mb-4">
                            <div class="bg-indigo-100 p-3 rounded-lg mr-4">
                                <i class="fas fa-database text-indigo-600"></i>
                            </div>
                            <h3 class="heading text-xl font-semibold text-gray-800">缓存管理</h3>
                        </div>
                        <p class="text-gray-700">自动缓存方法结果，避免重复计算或数据库访问，提高系统性能。</p>
                    </div>
                    
                    <!-- Validation -->
                    <div class="card-hover bg-white border border-gray-200 rounded-lg shadow-sm p-6 transition duration-300">
                        <div class="flex items-center mb-4">
                            <div class="bg-indigo-100 p-3 rounded-lg mr-4">
                                <i class="fas fa-check-circle text-indigo-600"></i>
                            </div>
                            <h3 class="heading text-xl font-semibold text-gray-800">参数校验</h3>
                        </div>
                        <p class="text-gray-700">对方法参数进行统一校验，确保输入数据的合法性，避免重复的校验代码。</p>
                    </div>
                </div>
            </div>
        </section>

        <!-- Pros and Cons Section -->
        <section class="mb-16">
            <div class="bg-white rounded-xl shadow-lg p-8">
                <h2 class="heading text-3xl font-bold mb-6 text-gray-800">5. 优点和挑战</h2>
                
                <div class="grid md:grid-cols-2 gap-8">
                    <!-- Pros -->
                    <div>
                        <div class="flex items-center mb-4">
                            <div class="bg-green-100 p-3 rounded-lg mr-4">
                                <i class="fas fa-check-circle text-green-600"></i>
                            </div>
                            <h3 class="heading text-xl font-semibold text-gray-800">优点</h3>
                        </div>
                        <ul class="space-y-4">
                            <li class="flex">
                                <div class="flex-shrink-0 text-green-500 mt-1 mr-3">
                                    <i class="fas fa-check"></i>
                                </div>
                                <div>
                                    <h4 class="font-medium text-gray-800">解耦</h4>
                                    <p class="text-gray-700">通过将横切关注点与业务逻辑分离，提高了代码的模块化</p>
                                </div>
                            </li>
                            <li class="flex">
                                <div class="flex-shrink-0 text-green-500 mt-1 mr-3">
                                    <i class="fas fa-check"></i>
                                </div>
                                <div>
                                    <h4 class="font-medium text-gray-800">复用</h4>
                                    <p class="text-gray-700">可以将相同的横切逻辑复用到多个类中，减少代码重复</p>
                                </div>
                            </li>
                            <li class="flex">
                                <div class="flex-shrink-0 text-green-500 mt-1 mr-3">
                                    <i class="fas fa-check"></i>
                                </div>
                                <div>
                                    <h4 class="font-medium text-gray-800">维护性</h4>
                                    <p class="text-gray-700">集中管理横切逻辑，便于维护和修改</p>
                                </div>
                            </li>
                        </ul>
                    </div>
                    
                    <!-- Cons -->
                    <div>
                        <div class="flex items-center mb-4">
                            <div class="bg-red-100 p-3 rounded-lg mr-4">
                                <i class="fas fa-exclamation-triangle text-red-600"></i>
                            </div>
                            <h3 class="heading text-xl font-semibold text-gray-800">挑战</h3>
                        </div>
                        <ul class="space-y-4">
                            <li class="flex">
                                <div class="flex-shrink-0 text-red-500 mt-1 mr-3">
                                    <i class="fas fa-times"></i>
                                </div>
                                <div>
                                    <h4 class="font-medium text-gray-800">复杂性</h4>
                                    <p class="text-gray-700">引入AOP可能会增加系统的复杂性，尤其是在调试和排查问题时</p>
                                </div>
                            </li>
                            <li class="flex">
                                <div class="flex-shrink-0 text-red-500 mt-1 mr-3">
                                    <i class="fas fa-times"></i>
                                </div>
                                <div>
                                    <h4 class="font-medium text-gray-800">性能开销</h4>
                                    <p class="text-gray-700">切面编程可能会引入额外的性能开销，特别是在复杂的切入点匹配和通知执行时</p>
                                </div>
                            </li>
                            <li class="flex">
                                <div class="flex-shrink-0 text-red-500 mt-1 mr-3">
                                    <i class="fas fa-times"></i>
                                </div>
                                <div>
                                    <h4 class="font-medium text-gray-800">学习曲线</h4>
                                    <p class="text-gray-700">AOP概念和Spring AOP实现方式需要一定的学习成本</p>
                                </div>
                            </li>
                        </ul>
                    </div>
                </div>
            </div>
        </section>
    </div>

    <!-- Footer -->
    <footer class="bg-gray-900 text-white py-8">
        <div class="container mx-auto max-w-5xl px-4 text-center">
            <div class="flex flex-col items-center">
                <h3 class="text-lg font-medium mb-2">技术小馆</h3>
                <a href="http://www.yuque.com/jtostring" class="footer-link text-gray-400 hover:text-gray-300 transition duration-300">
                    <i class="fas fa-book mr-1"></i> www.yuque.com/jtostring
                </a>
            </div>
        </div>
    </footer>

    <script>
        mermaid.initialize({
            startOnLoad: true,
            theme: 'default',
            flowchart: {
                useMaxWidth: true,
                htmlLabels: true,
                curve: 'basis'
            }
        });
    </script>
</body>
</html>
```